perm filename FLIST.SAI[SYS,HE] blob sn#021173 filedate 1973-01-22 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00003 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	BEGIN "FLIST"
 00004 00003	SIMPLE BOOLEAN PROCEDURE TEST(STRING PN INTEGER PL)
 00008 ENDMK
⊗;
BEGIN "FLIST"

REQUIRE 5000 STRING_SPACE;
EXTERNAL INTEGER SPALL;
STRING COM, FILE, PAGE, FP, LP, T, LIN;
DEFINE CR="'15", LF="'12", FF="'14", DSK="1", LPT="2";
INTEGER BRK, EOF, FLG, FL, LL, L, COUNT, LOC, SP, TP, PAGIND;
BOOLEAN SPOOL;
LABEL LOOP, NXTSET;
PRELOAD_WITH [128] 0;
SAFE INTEGER ARRAY SPLFIL[0:127];

SIMPLE PROCEDURE GET;
	BEGIN
	PAGE ← INPUT(DSK,4);
	CASE LOC OF
		BEGIN "CASE1"
		BEGIN "FIRST";
		T ← PAGE;
		LIN ← SCAN(T,3,BRK);
		L ← LENGTH(LIN);
		END "FIRST";
		L ← IF PAGE[∞ FOR 1]=LF THEN LENGTH(PAGE)-2
			ELSE LENGTH(PAGE);
		;
		END "CASE1";
	COUNT ← COUNT+1;
	IF ¬(COUNT MOD 5) THEN OUTSTR("  "&CVS(COUNT));
	END;

SIMPLE INTEGER PROCEDURE XWD;
	START_CODE
	HRL 1,SP;
	HRR 1,TP;
	END;
SIMPLE BOOLEAN PROCEDURE TEST(STRING PN; INTEGER PL);
	BEGIN
	IF PL≤0 THEN RETURN(FALSE);
	CASE LOC OF
		BEGIN "CASE2"
		RETURN(L≥PL∧EQU(PN,LIN[L+1-PL FOR PL]));
		RETURN(L≥PL∧EQU(PN,PAGE[L+1-PL FOR PL]));
		BEGIN "DECIDE"
		T ← PAGE;
		LIN ← SCAN(T,3,BRK);
		L ← LENGTH(LIN);
		IF L≥PL∧EQU(PN,LIN[L+1-PL FOR PL]) THEN
			BEGIN
			LOC ← 0;
			RETURN(TRUE);
			END;
		L ← IF PAGE[∞ FOR 1]=LF THEN LENGTH(PAGE)-2
			ELSE LENGTH(PAGE);
		IF L≥PL∧EQU(PN,PAGE[L+1-PL FOR PL]) THEN
			BEGIN
			LOC ← 1;
			RETURN(TRUE);
			END;
		END "DECIDE";
		END "CASE2";
	RETURN(FALSE);
	END "TEST";

SETBREAK(1," ",NULL,"I");
SETBREAK(2," →",NULL,"I");
SETBREAK(3,LF,CR,"I");
SETBREAK(4,FF,NULL,"I");

LOOP:	OUTSTR(CR&LF&"*");
	COUNT ← 0;
	COM ← INCHWL;
	LOC ← 2;
	L←COM[1 FOR 1];
	IF (SPOOL←COM="*") THEN COM←COM[2 FOR ∞];
	IF COM="↑" THEN BEGIN LOC←0; COM←COM[2 FOR ∞]; END;
	IF COM="↓" THEN BEGIN LOC←1; COM←COM[2 FOR ∞]; END;
	DO FILE←SCAN(COM,1,BRK) UNTIL LENGTH(FILE)∨¬LENGTH(COM);
	IF ¬LENGTH(FILE) THEN GO TO LOOP;
	IF SPOOL THEN
		BEGIN "SPINIT"
		SPLFIL[7] ← CVFIL(FILE,SPLFIL[8],SPLFIL[10]);
		SPLFIL[14] ← '100;
		PAGIND ← 15;
		END "SPINIT" ELSE BEGIN "NOSPOOL"
		OPEN(LPT,"LPT",0,0,6,0,BRK,EOF←FALSE);
		ENTER(LPT,"FLIST.LST",FLG);
		END "NOSPOOL";
	OPEN(DSK,"DSK",0,6,0,10000,BRK,EOF←FALSE);
	LOOKUP(DSK,FILE,FLG);
	IF FLG THEN
		BEGIN
		OUTSTR(FILE&" NOT FOUND");
		GO TO LOOP;
		END;
	GET;
NXTSET:	DO FP←SCAN(COM,2,BRK) UNTIL LENGTH(FP)∨BRK="→"∨¬BRK;
	FL ← LENGTH(FP);
	IF BRK="→" THEN
		BEGIN
		DO LP←SCAN(COM,1,BRK) UNTIL LENGTH(LP)∨¬BRK;
		LL ← LENGTH(LP);
		END ELSE LL ← -1;
	IF FL THEN WHILE ¬(EOF∨TEST(FP,FL)) DO GET;
	IF ¬EOF THEN
		BEGIN
		SP ← COUNT;
		DO	BEGIN
			IF ¬SPOOL THEN OUT(LPT,PAGE&FF);
			IF EOF THEN
				BEGIN
				COUNT ← COUNT+1;
				DONE;
				END;
			GET;
			END UNTIL LL=-1∨TEST(LP,LL);
		TP ← COUNT-1;
		IF SPOOL THEN IF PAGIND+1>126 THEN
			OUTSTR("TOO MANY PAGES")
			ELSE SPLFIL[PAGIND←PAGIND+1] ← XWD;
		IF LENGTH(COM) THEN GO TO NXTSET;
		END;
	IF SPOOL THEN IF PAGIND=15 THEN OUTSTR("NO OUTPUT") ELSE
		BEGIN "SPEND" LABEL L1;
		SPLFIL[PAGIND+1]←0;
		START_CODE
		HRRZ 1,SPLFIL;
		HRRM 1,L1;
		PUSHJ '17,SPALL;
L1:		JUMP 0;
		END;
		END "SPEND" ELSE RELEASE(LPT);
	RELEASE(DSK);
	GO TO LOOP;
END "FLIST";